/*
 * TDS PEC 4
 * Grupo 3H2M
 * 
 * El paquete <code>edu.uoc.tds.pec4.estadisticas</code> contiene la implementación de
 * todas las clases necesarias para la interfaz gráfica del ss de estadísticas
 *
 */
package edu.uoc.tds.pec4.estadisticas;

import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.RentabilidadLocalizacionDTO;
import edu.uoc.tds.pec4.common.components.TablaUI;
import edu.uoc.tds.pec4.common.filters.FiltroLocalizacion;
import edu.uoc.tds.pec4.common.util.Cabecera;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

/**
 *
 * @author Isabel Guerra Monclova
 */
public class DialogResultadoRentabilidadLocalizaciones extends javax.swing.JDialog {
    
    private List<RentabilidadLocalizacionDTO> listado = null;
    
    //Contendra el listado obtenido, en formato grid
    private TablaUI tablaListado = null;
    private JScrollPane jScrollPane = null;
    
    /** Creates new form JDResultadoRankingAulas */
    public DialogResultadoRentabilidadLocalizaciones(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        inicializarComponentes();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        localizacion = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        fechaInicio = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        fechaFin = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        top = new javax.swing.JTextField();
        panelListado = new javax.swing.JPanel();
        cerrar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(TDSLanguageUtils.getMessage("estadistica.resultado")+" "+TDSLanguageUtils.getMessage("estadistica.rentabilidad.localizaciones.titulo"));

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(TDSLanguageUtils.getMessage("resultados.filtros.seleccionados")));

        jLabel1.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.localizacion"));

        localizacion.setEnabled(false);

        jLabel3.setText(TDSLanguageUtils.getMessage("estadistica.ranking.fecha.inicio"));

        fechaInicio.setEnabled(false);

        jLabel4.setText(TDSLanguageUtils.getMessage("estadistica.ranking.fecha.fin"));

        fechaFin.setEnabled(false);
        fechaFin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fechaFinActionPerformed(evt);
            }
        });

        jLabel6.setText(TDSLanguageUtils.getMessage("estadistica.ranking.top"));

        top.setEnabled(false);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGap(67, 67, 67)
                                .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 813, Short.MAX_VALUE))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(localizacion, javax.swing.GroupLayout.DEFAULT_SIZE, 876, Short.MAX_VALUE))))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(fechaFin))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(fechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(18, 18, 18)
                        .addComponent(jLabel6)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(top, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2)
                    .addComponent(localizacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(8, 8, 8)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(fechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3)
                    .addComponent(jLabel6)
                    .addComponent(top, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(8, 8, 8)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(fechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelListado.setBorder(javax.swing.BorderFactory.createTitledBorder(TDSLanguageUtils.getMessage("estadistica.rentabilidad.localizaciones.titulo")));

        javax.swing.GroupLayout panelListadoLayout = new javax.swing.GroupLayout(panelListado);
        panelListado.setLayout(panelListadoLayout);
        panelListadoLayout.setHorizontalGroup(
            panelListadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 966, Short.MAX_VALUE)
        );
        panelListadoLayout.setVerticalGroup(
            panelListadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 211, Short.MAX_VALUE)
        );

        cerrar.setText(TDSLanguageUtils.getMessage("boton.cerrar"));
        cerrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cerrarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(cerrar)
                    .addComponent(panelListado, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelListado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cerrar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void fechaFinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fechaFinActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_fechaFinActionPerformed

private void cerrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cerrarActionPerformed
    dispose();
}//GEN-LAST:event_cerrarActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton cerrar;
    private javax.swing.JTextField fechaFin;
    private javax.swing.JTextField fechaInicio;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField localizacion;
    private javax.swing.JPanel panelListado;
    private javax.swing.JTextField top;
    // End of variables declaration//GEN-END:variables

    public void setFechaFin(JTextField fechaFin) {
        this.fechaFin.setText(fechaFin.getText());
    }

    public void setFechaInicio(JTextField fechaInicio) {
        this.fechaInicio.setText(fechaInicio.getText());
    }

    public void setLocalizacion(FiltroLocalizacion filtro, int tipoLocalizacion) {
        String lista = "";
        int size = 1;
        
        if(tipoLocalizacion == Constantes.TIPO_LOCALIZACION_CIUDADES) {
            for(CiudadDTO ciu : filtro.getCiudades()) {
                if (size == 1) {
                    lista = ciu.getNomCiudad();
                } else {
                    lista = lista + ", " + ciu.getNomCiudad();
                }
                size ++;
            }
        } else if (tipoLocalizacion == Constantes.TIPO_LOCALIZACION_PROVINCIAS) {
            for(ProvinciaDTO pro : filtro.getProvincias()) {
                if (size == 1) {
                    lista = pro.getNomProvincia();
                } else {
                    lista = lista + ", " + pro.getNomProvincia();
                }
                size ++;
            }            
        } else {
            for(PaisDTO pais : filtro.getPaises()) {
                if (size == 1) {
                    lista = pais.getNomPais();
                } else {
                    lista = lista + ", " + pais.getNomPais();
                }
                size ++;
            }            
        }
        
        this.localizacion.setText(lista);
    }

    public void setTop(String texto) {
        this.top.setText(texto);
    }

    public List<RentabilidadLocalizacionDTO> getListado() {
        return listado;
    }

    public void setListado(List<RentabilidadLocalizacionDTO> listado) {
        this.listado = listado;
        //Montar tabla de resultados
        
        if(!listado.isEmpty()) {
            panelListado.add(getJScrollPane(), null);
            tablaListado.setFilas(getFilasTabla(listado));
            tablaListado.refrescarFilas();
        }
    }
    
     /**
     * A partir de una lista de objetos, devuelve listas de listas de objetos para
     * que se puedan mostrar en una tabla
     *
     * @return javax.swing.JTable
     */
    private List<List> getFilasTabla(List<RentabilidadLocalizacionDTO> vCv) {
        List<List> rentabilidad = new ArrayList<List>();

        try {
            
            List<String> vLocalizacion = new ArrayList<String>();
            List<Integer> vCliente = new ArrayList<Integer>();
            List<Integer> vReserva = new ArrayList<Integer>();
            List<Integer> vReservaAtendida = new ArrayList<Integer>();
            List<Integer> vReservaCancelada = new ArrayList<Integer>();
            List<String> vFactTotal = new ArrayList<String>();
            List<String> vFactAtendidas = new ArrayList<String>();
            List<String> vFactCanceladas = new ArrayList<String>();                  
            List<Integer> vAsistentes = new ArrayList<Integer>();
            List<String> vMediaAsis = new ArrayList<String>();
            List<String> vMediaAsisGlobal = new ArrayList<String>();
            List<String> vMediaFactReserva = new ArrayList<String>();
            List<String> vMediaFactReservaGlobal = new ArrayList<String>();

            
            for (RentabilidadLocalizacionDTO cv : vCv) {

                vLocalizacion.add(cv.getLocalizacion());
                vCliente.add(cv.getClientes());
                vReserva.add(cv.getReservas().getTotalReservas());
                vReservaAtendida.add(cv.getReservas().getTotalReservasConsumadas());
                vReservaCancelada.add(cv.getReservas().getTotalReservasCanceladas());
                vFactTotal.add(UtilidadesGUI.obtenerImporte(cv.getFacturacion().getTotal()));
                vFactAtendidas.add(UtilidadesGUI.obtenerImporte(cv.getFacturacion().getTotalConsumadas()));
                vFactCanceladas.add(UtilidadesGUI.obtenerImporte(cv.getFacturacion().getTotalCanceladas()));
                vAsistentes.add(cv.getAsistentes());
                vMediaAsis.add(UtilidadesGUI.obtenerDecimal(cv.getMediaAsistentes()));
                vMediaAsisGlobal.add(UtilidadesGUI.obtenerDecimal(cv.getDiferenciaMediaAsistentes()));
                vMediaFactReserva.add(UtilidadesGUI.obtenerDecimal(cv.getFacturacionMedia().getMedia()));
                vMediaFactReservaGlobal.add(UtilidadesGUI.obtenerDecimal(cv.getFacturacionMedia().getDiferencia()));
                
            }

            rentabilidad.add(vLocalizacion);
            rentabilidad.add(vCliente);
            rentabilidad.add(vReserva);
            rentabilidad.add(vReservaAtendida);
            rentabilidad.add(vReservaCancelada);
            rentabilidad.add(vFactTotal);
            rentabilidad.add(vFactAtendidas);
            rentabilidad.add(vFactCanceladas);
            rentabilidad.add(vAsistentes);
            rentabilidad.add(vMediaAsis);
            rentabilidad.add(vMediaAsisGlobal);
            rentabilidad.add(vMediaFactReserva);
            rentabilidad.add(vMediaFactReservaGlobal);
            
        } catch (Exception e) {
            System.out.println("por aqui se va...");
            JOptionPane.showMessageDialog(null,
                TDSLanguageUtils.getMessage("estadistica.error.filas") + Constantes.SL +
                e.getMessage(), TDSLanguageUtils.getMessage("estadistica.error"),
                JOptionPane.ERROR_MESSAGE);
        }

        return rentabilidad;
    }


    private void inicializarComponentes() {
        //panelListado.add(getJScrollPane(), null);

    }

    /**
     * Este método inicializa jScrollPane
     *
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 20, 960, 175));
            jScrollPane.setViewportView(getTablaListado());
        }
        return jScrollPane;
    }

    private Component getTablaListado() {
        if (tablaListado == null) {
            tablaListado = new TablaUI(getCabecerasTabla(), getFilasTabla(new ArrayList<RentabilidadLocalizacionDTO>()));
            tablaListado.setLocation(new Point(0, 0));

            // PENDIENTE: Captura del evento sobre la columna para ordenar mediante SQL
            tablaListado.getTableHeader().addMouseListener(new MouseAdapter() {
                
                  public void mouseClicked(MouseEvent mouseEvent) {
                    int index = tablaListado.convertColumnIndexToModel(tablaListado.columnAtPoint(mouseEvent.getPoint()));
                    if (index >= 0) {
                      System.out.println("Click en columna " + index + " " + tablaListado.getModel().getColumnName(index));
                    }
                  };
                });            
        }
        return tablaListado;
    }

    private List<Cabecera> getCabecerasTabla() {
       // La Cabecera indica el nombre de columna y tamaño
        List<Cabecera> vCabecera = new ArrayList<Cabecera>();

        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.ranking.tabla.localizacion"),50));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.clientes"),50));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.numReservas"),80));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.atendidas"),90));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.canceladas"),90));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.total"),80));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.total.atendidas"),90));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.total.canceladas"),90));        
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.numAsistentes"),90));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.media.asistentes.reserva"),80));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.respecto.media"),80));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.media.facturacion"),80));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("estadistica.rentabilidad.tabla.respecto.media"),90));

        return vCabecera;
    }
}
